
;======
;boot
;@auth Mike/Fang.j/Q184377367
;======

;boot程序，加载用户程序
;@auth Mike/Fang.j/Q184377367

;不要问为什么在0x7c00,说白了，硬件编址决定的
;用10进制来描述的话，假设0123456789 10个地址，前九个地址CPU给了其他的硬件，
;那你就只能从9开始写入代码了

org 0x7C00    ;主引导记录的内存地址
[bits 16]
align 16

entry:
  mov ah,0fh
  mov al,0ah
  int 10h

  mov ax, 0
  mov ss, ax
  mov ds, ax
  mov es, ax
  mov si, msg    ;将msg地址赋给si

putLoop:
    mov al, [si]    ;等同 mov al, byte [si]  将si地址开始的一个字节的值放入al中
    add si, 1    ;si = si+1
    cmp al, 0    ;al与0比较
    je pause        ;如上面比较相等 则跳转到fin 不相等则不跳转,执行后面命令
    mov ah, 0x0e
    int 0x10
    jmp putLoop
  
 pause:
  


  mov ax,900H
  mov es,ax
  mov bx,0
  ;这儿已经构造好es和bx 通过es:bx 确定读出的数据放到物理内存的哪个区间
  ;上面定义的是9000:0
  mov al,1;读几个扇区
  mov ch,0;柱面
  mov cl,2;要读哪个扇区
  mov dl,0;驱动器
  mov dh,0;磁道
  mov ah,02H;这儿必须加H 别问为什么。。
  int 13h

  ;必须加H。。。不然字节会错。。
  jmp	900H:0H

  msg:
  DB 0x0a, 0x0a
  DB "fos start boot...."
  ;DB 0
  times 510-($-$$) db 0;填充510字节的0，$$表示编译后的起始地址
  dw 0xaa55 ;表示结束，加上前面的510字节正好512字节满足条件